/**
 * @file bsp_button.h
 * @brief 按键封装驱动
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2020-08-14
 * @copyright Copyright (c) 2020  烽火通信
 */
#ifndef __BSP_BUTTON_H
#define __BSP_BUTTON_H 

#ifdef __cplusplus
extern "C" {
#endif
#include "project_config.h"
#if USE_BSP_BUTTON

#include <stdint.h>
#include <bsp_gpio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"


#define BUTTON_PUSH        1    ///< 按键按下
#define BUTTON_RELEASE     0    ///< 按键释放
#define BUTTON_ACTIVE_HIGH 1    ///< 按键高有效
#define BUTTON_ACTIVE_LOW  0    ///< 按键低有效

typedef void (*button_handler_t)(uint8_t pin_no, uint8_t btn_action);   ///< 按键事件处理注册函数

/**
 * @brief 按键信息结构体
 */
typedef struct
{
    uint8_t pin_no;         ///< 引脚号 PA8(8) */
    Gpio_t btn_gpio;        ///< GPIO句柄
    uint8_t active_state;   ///< 按键有效状态 @ref BUTTON_ACTIVE_HIGH @ref BUTTON_ACTIVE_LOW
    button_handler_t button_handler;    ///< 按键动作处理函数
    TimerHandle_t btn_timer;            ///< 按键检测超时计时器
} Button_t;

/**
 * @brief 按键初始化
 * @param[in]  p_gpio       gpio句柄
 * @param[in]  pin          引脚
 * @param[in]  type         上下拉类型 @ref PIN_NO_PULL @ref PIN_PULL_UP @ref PIN_PULL_DOWN
 * @param[in]  active_state 按键有效值 @ref BUTTON_ACTIVE_HIGH @ref BUTTON_ACTIVE_LOW
 * @param[in]  detection_delay 按键检测延时时间(ms)
 * @param[in]  btn_handle   按键事件处理回调
 * @return int8_t - @b Sucess : @ref BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_NO_MEM - 内存不足
 */
int8_t button_init(Gpio_t *p_gpio, PinNames pin, PinTypes type, uint8_t active_state, uint16_t detection_delay, button_handler_t btn_handle);


#endif	/* USE_BSP_BUTTON */

#ifdef __cplusplus
}
#endif //__cplusplus 

#endif	 // __BSP_BUTTON_H 

/*********** (C) COPYRIGHT 2020 FiberHome *****END OF FILE****/
